/******************************************************************************************
Copyright(C), 2019-2020, Linyar.
文件名：L_MPP40_vo.c
作者：燕卫博    版本：V1.1    创建日期：2021.5.27
文件描述：
    对Hi3516DV300平台执行MPP-VO初始化，仅编写HDMI功能，不绑定前级模块。
版本信息：
    9Hv2，个人。
历史修改记录：
1. 2021-5-27:V1.1 燕卫博
从STv9-t拷贝更改，删除MIPI_Tx适配。

2. 2021-8-11:V1.0 燕卫博
从9Hv1拷贝，接续使用。
******************************************************************************************/
//                                              ↓
//+------------------------------------------------------------------------------------------+
//|                                          文件说明
//+------------------------------------------------------------------------------------------+
//|      本文件基于Hi3516DV300实现HDMI的配置输出。如何输出通过文件中的配置进行设置而非传参。
//|      VO（Video Output，视频输出）模块主动从内存相应位置读取视频和图形数据，并通过相应的显
//|  示设备输出视频和图形。——《参考》P457
//|      Hi3516DV300仅有一个视频显示设备DHD0，每个显示设备包含视频层和图形层；回写设备支持到
//|  DHD0的设备级回写和视频层回写。——《参考》P457
//|      Hi3516DV300的DHD0最大输出时序为1080P@60fps，输出接口支持HDMI/BT1120/BT656/MIPI-Tx/
//|  LCD。——《参考》P460
//|  故本文件使用DHD0输出到HDMI。
//|      Hi3516DV300各接口时序为：——《参考》P463
//|                         +----------------------------------------+
//|                         | HDMI  |1080P@60                        |
//|                         |MIPI-Tx|1080P@60                        |
//|                         |BT.1120|1080P@60                        |
//|                         |BT.656 |1080P@30（需配置用户时序）      |
//|                         |  LCD  |1080P@60（需配置用户时序）      |
//|                         +----------------------------------------+
//|      一个视频层上可显示多个视频，每一个视频显示区域称为一个通道。
//|  视频层在显示视频图像上的策略为：
//|      对于支持缩放的视频层，则对视频进行缩放显示，
//|      对于不支持缩放的视频层，则对于视频进行裁剪显示。
//|  [注意]输出时的HDMI输出制式需要适配显示器，老式显示器可能不支持1080P60而支持1080I60。
//+------------------------------------------------------------------------------------------+
//|                                         头文件包含
//+------------------------------------------------------------------------------------------+
/*|*/  #include "L_MPP40_vo.h"
/*|*/  #include "L_MPP40_debug.h"
//+------------------------------------------------------------------------------------------+
//|                                         参数宏定义
//+------------------------------------------------------------------------------------------+
//|    当前仅支持HDMI输出
/*|*/#define HDMI_ENABLE
//|    用于字节对齐的宏和颜色RGB编码
/*|*/  #define ALIGN_DOWN(x,a)    (((x)/(a))*(a))
/*|*/  #define COLOR_RGB_RED      0xFF0000
/*|*/  #define COLOR_RGB_GREEN    0x00FF00
/*|*/  #define COLOR_RGB_BLUE     0x0000FF
/*|*/  #define COLOR_RGB_BLACK    0x000000
/*|*/  #define COLOR_RGB_YELLOW   0xFFFF00
/*|*/  #define COLOR_RGB_CYN      0x00ffff
/*|*/  #define COLOR_RGB_WHITE    0xffffff
//+------------------------------------------------------------------------------------------+
//                                              ↓
//+------------------------------------------------------------------------------------------+
//|                                          全局变量
//+------------------------------------------------------------------------------------------+
//|    VO设备的参数设置，对于本文件是固定的
//|                     --------------------[HDMI相关]--------------------
/*|*/#ifdef HDMI_ENABLE
//|    --HDMI输出设备选择
/*|*/  static const VO_DEV VoDev_HDMI=0;//本文件固定
//|    ----------------------------------------
//|    --HDMI视频层选择
//|    Hi3516DV300只有一个视频层，VHD0固定绑在HD0。
//|    ——《参考》P462
//|    ----------------------------------------
/*|*/  static const VO_LAYER VoLayer_HDMI=0;
//|    --HDMI输出制式
/*|*/  static const VO_INTF_SYNC_E enIntfSync_HDMI=VO_OUTPUT_1080P60;
//|    ----------------------------------------
//|    --HDMI输出帧率
//|    如果输出帧率大于源帧率，会造成性能浪费。
//|    ----------------------------------------
/*|*/  static const HI_S32 u32DispFrmRt_HDMI=60;
//|    --HDMI视频制式
/*|*/  static const HI_HDMI_VIDEO_FMT_E enVideoFmt_HDMI=HI_HDMI_VIDEO_FMT_1080P_60;
//|    ----------------------------------------
//|    --HDMI显示分辨率
//|    显示分辨率为设备上显示区域的分辨率
//|    Hi3516DV300的VHD0最大分辨率为1080P，
//|    所以设置的分辨率不能超过这个值。
//|    ——《参考》P651
//|    对于不支持缩放的视频层，通常保持图像分辨
//|    率和显示分辨率一致。——《参考》P652
//|    [注意]Hi3516DV300视频层均不支持缩放。
//|    ——《参考》P461
//|    ----------------------------------------
/*|*/  static const HI_U32 u32DispWidth_HDMI =1920;
/*|*/  static const HI_U32 u32DispHeight_HDMI=1080;
//|    ----------------------------------------
//|    --HDMI图片分辨率
//|    图片分辨率为在设备层绑定的视频层的画布大小
//|    这里配置为单通道显示。
//|    对于不支持缩放的视频层，通常保持图像分辨
//|    率和显示分辨率一致。——《参考》P652
//|    [注意]Hi3516DV300视频层均不支持缩放。
//|    ——《参考》P461
//|    ----------------------------------------
/*|*/  static const HI_U32 u32ImageWidth_HDMI =1920;
/*|*/  static const HI_U32 u32ImageHeight_HDMI=1080;
//|    ----------------------------------------
//|    --HDMI通道分辨率
//|    通道显示区域不能超过视频层属性中设定的画
//|    布大小(stImageSize大小)。
//|    ——《参考》P657
//|    *通道分辨率在VO_StartChn中依据窗口划分方
//|    式的不同从图像分辨率获得，不需手动设置。
//|    ----------------------------------------
/*|*/  //static const HI_U32 u32ChnWidth_HDMI =1920;
/*|*/  //static const HI_U32 u32ChnHeight_HDMI=1080;
//|    ----------------------------------------
//|    --视频输出通道的通道号
//|    本例使用单通道。VHD0通道数最大为4
//|    ----------------------------------------
/*|*/  static const VO_CHN VoChn_HDMI=0;
/*|*/#endif
//+------------------------------------------------------------------------------------------+

//+------------------------------------------------------------------------------------------+
//|  函数名称：L_Start_HDMI
//|  功能描述：启动HDMI。
//|  参数说明：DYNAMIC_RANGE_E类型动态范围
//|  返回值说明：成功返回0
//|  备注：
//+------------------------------------------------------------------------------------------+
#ifdef HDMI_ENABLE
static int L_Start_HDMI(DYNAMIC_RANGE_E enDyRg)
{
    HI_S32 s32Ret = HI_SUCCESS;
    do
    {
        HI_HDMI_ID_E enHdmiId = HI_HDMI_ID_0;
        HI_HDMI_ATTR_S stAttr;
        s32Ret = HI_MPI_HDMI_Init();
        if(HI_SUCCESS != s32Ret){LOGE("[MPP-VO(HDMI)-ERROR]L_Start_HDMI:HI_MPI_HDMI_Init failed with %#x!\n", s32Ret);break;}

        s32Ret = HI_MPI_HDMI_Open(enHdmiId);
        if(HI_SUCCESS != s32Ret){LOGE("[MPP-VO(HDMI)-ERROR]L_Start_HDMI:HI_MPI_HDMI_Open failed with %#x!\n", s32Ret);break;}

        s32Ret = HI_MPI_HDMI_GetAttr(enHdmiId,&stAttr);
        if(HI_SUCCESS != s32Ret){LOGE("[MPP-VO(HDMI)-ERROR]L_Start_HDMI:HI_MPI_HDMI_GetAttr failed with %#x!\n", s32Ret);break;}

        //****************************************
        //强制HDMI输出
        //该结构体设置参考《HDMI开发参考(2019-8-1)》P51
        //****************************************
        stAttr.bEnableHdmi = HI_TRUE;
        //****************************************
        //HI_TRUE：输出正常图像
        //HI_FALSE：输出黑屏
        //****************************************
        stAttr.bEnableVideo = HI_TRUE;
        stAttr.enVideoFmt = enVideoFmt_HDMI;//视频制式
        //****************************************
        //HDMI输出视频模式
        //HI_HDMI_VIDEO_MODE_RGB444、
        //HI_HDMI_VIDEO_MODE_YCBCR422、
        //HI_HDMI_VIDEO_MODE_YCBCR444、
        //HI_HDMI_VIDEO_MODE_YCBCR420（支持HDMI2.0规格）
        //****************************************
        stAttr.enVidOutMode = HI_HDMI_VIDEO_MODE_YCBCR444;
        switch(enDyRg)
        {
            case DYNAMIC_RANGE_SDR8:
                stAttr.enDeepColorMode = HI_HDMI_DEEP_COLOR_24BIT;
                break;
            case DYNAMIC_RANGE_HDR10:
                stAttr.enVidOutMode    = HI_HDMI_VIDEO_MODE_YCBCR422;
                break;
            default:
                stAttr.enDeepColorMode = HI_HDMI_DEEP_COLOR_24BIT;
                break;
        }
        stAttr.enOutCscQuantization = HDMI_QUANTIZATION_LIMITED_RANGE;
        //****************************************
        //是否使能xvYCC输出模式。
        //默认为HI_FALSE。Hi35xx暂不支持。
        //****************************************
        stAttr.bxvYCCMode = HI_FALSE;
        //****************************************
        //是否使能音频
        //****************************************
        stAttr.bEnableAudio = HI_FALSE;
        //****************************************
        //HDMI音频来源。
        //Hi35xx目前只支持HI_HDMI_SND_INTERFACE_I2S
        //****************************************
        stAttr.enSoundIntf = HI_HDMI_SND_INTERFACE_I2S;
        //****************************************
        //多声道还是立体声。
        //0：立体声
        //1：多声道（固定为8声道）
        //****************************************
        stAttr.bIsMultiChannel = HI_FALSE;
        //****************************************
        //音频位宽，默认为16，此参数需要与AO的配置保持一致。
        //建议用户设置为Sink能力集支持位宽。
        //****************************************
        stAttr.enBitDepth = HI_HDMI_BIT_DEPTH_16;
        //****************************************
        //是否使能 AVI InfoFrame。
        //建议使能。
        //****************************************
        stAttr.bEnableAviInfoFrame = HI_TRUE;
        //****************************************
        //是否使能 AUDIO InfoFrame。
        //建议使能。
        //DVI模式不能使能AUDIO InfoFrame。
        //****************************************
        stAttr.bEnableAudInfoFrame = HI_TRUE;
        //****************************************
        //是否使能 SPD InfoFrame。
        //默认关闭，Hi35xx不支持该项使能。
        //****************************************
        stAttr.bEnableSpdInfoFrame = HI_FALSE;
        //****************************************
        //是否使能 MPEG InfoFrame。
        //默认关闭，Hi35xx不支持该项使能。
        //****************************************
        stAttr.bEnableMpegInfoFrame = HI_FALSE;
        //****************************************
        //是否使能打开hdmi内部debug信息。
        //默认为0，Hi35xx不支持该项使能。
        //****************************************
        stAttr.bDebugFlag = HI_FALSE;
        //****************************************
        //是否激活HDCP。
        //0：HDCP不激活
        //1：HDCP模式打开
        //默认为0，Hi35xx不支持该项使能。
        //****************************************
        stAttr.bHDCPEnable = HI_FALSE;
        //****************************************
        //是否激活3D模式。
        //0：3D不激活
        //1：3D模式打开
        //默认为0，Hi35xx不支持该项使能。
        //****************************************
        stAttr.b3DEnable = HI_FALSE;
        //****************************************
        //EDID读取失败时，HDMI内部强制的视频输出模式枚举
        //默认为HI_HDMI_FORCE_HDMI。
        //****************************************
        stAttr.enDefaultMode = HI_HDMI_FORCE_HDMI;
        s32Ret = HI_MPI_HDMI_SetAttr(enHdmiId,&stAttr);
        if(HI_SUCCESS != s32Ret){LOGE("[MPP-VO(HDMI)-ERROR]L_Start_HDMI:HI_MPI_HDMI_SetAttr failed with %#x!\n", s32Ret);break;}

        s32Ret = HI_MPI_HDMI_Start(enHdmiId);
        if(HI_SUCCESS != s32Ret){LOGE("[MPP-VO(HDMI)-ERROR]L_Start_HDMI:HI_MPI_HDMI_Start failed with %#x!\n", s32Ret);break;}

        return 0;
    }while(0);

    return -1;
}
#endif

//+------------------------------------------------------------------------------------------+
//|  函数名称：L_Stop_HDMI
//|  功能描述：停止HDMI。
//|  参数说明：无
//|  返回值说明：无
//|  备注：
//+------------------------------------------------------------------------------------------+
#ifdef HDMI_ENABLE
static void L_Stop_HDMI(void)
{
    HI_HDMI_ID_E enHdmiId = HI_HDMI_ID_0;
    HI_MPI_HDMI_Stop(enHdmiId);
    HI_MPI_HDMI_Close(enHdmiId);
    HI_MPI_HDMI_DeInit();
}
#endif

//+------------------------------------------------------------------------------------------+
//|  函数名称：VO_StartChn
//|  功能描述：初始化并启动视频通道。
//|  参数说明：无
//|  返回值说明：成功返回0
//|  备注：由于涉及到较多的对齐操作，且例程中此函数独立性较好，故略作修改。
//+------------------------------------------------------------------------------------------+
static int VO_StartChn(VO_LAYER VoLayer)
{
    HI_S32 i;
    const VO_MODE_E enMode = VO_MODE_1MUX;//本文件仅使用一路，固定不要动
    HI_S32 s32Ret    = HI_SUCCESS;
    //HI_U32 u32WndNum = 0;
    HI_U32 u32Square = 0;
    HI_U32 u32Row    = 0;
    HI_U32 u32Col    = 0;
    HI_U32 u32Width  = 0;
    HI_U32 u32Height = 0;
    VO_CHN_ATTR_S         stChnAttr;
    VO_VIDEO_LAYER_ATTR_S stLayerAttr;

    switch (enMode) {
    case VO_MODE_1MUX:
        //u32WndNum = 1;
        u32Square = 1;
        break;
    case VO_MODE_2MUX:
        //u32WndNum = 2;
        u32Square = 2;
        break;
    case VO_MODE_4MUX:
        //u32WndNum = 4;
        u32Square = 2;
        break;
    case VO_MODE_8MUX:
        //u32WndNum = 8;
        u32Square = 3;
        break;
    case VO_MODE_9MUX:
        //u32WndNum = 9;
        u32Square = 3;
        break;
    case VO_MODE_16MUX:
        //u32WndNum = 16;
        u32Square = 4;
        break;
    case VO_MODE_25MUX:
        //u32WndNum = 25;
        u32Square = 5;
        break;
    case VO_MODE_36MUX:
        //u32WndNum = 36;
        u32Square = 6;
        break;
    case VO_MODE_49MUX:
        //u32WndNum = 49;
        u32Square = 7;
        break;
    case VO_MODE_64MUX:
        //u32WndNum = 64;
        u32Square = 8;
        break;
    case VO_MODE_2X4:
        //u32WndNum = 8;
        u32Square = 3;
        u32Row    = 4;
        u32Col    = 2;
        break;
    default:
        return HI_FAILURE;
    }

    s32Ret = HI_MPI_VO_GetVideoLayerAttr(VoLayer, &stLayerAttr);
    if (s32Ret != HI_SUCCESS) {
        LOGE("[MPP-VO-ERROR]VO_StartChn:HI_MPI_VO_GetVideoLayerAttr failed with %#x!\n", s32Ret);
        return HI_FAILURE;
    }
    u32Width  = stLayerAttr.stImageSize.u32Width;
    u32Height = stLayerAttr.stImageSize.u32Height;
    for(i = 0; i < u32Square; i++)
    {
        if( enMode == VO_MODE_1MUX  ||
            enMode == VO_MODE_2MUX  ||
            enMode == VO_MODE_4MUX  ||
            enMode == VO_MODE_8MUX  ||
            enMode == VO_MODE_9MUX  ||
            enMode == VO_MODE_16MUX ||
            enMode == VO_MODE_25MUX ||
            enMode == VO_MODE_36MUX ||
            enMode == VO_MODE_49MUX ||
            enMode == VO_MODE_64MUX )
        {
            if(u32Width > u32Height)
            {
                stChnAttr.stRect.s32X       = ALIGN_DOWN((u32Width / u32Square) * (i % u32Square), 2);
                stChnAttr.stRect.s32Y       = ALIGN_DOWN((u32Height / u32Square) * (i / u32Square), 2);
                stChnAttr.stRect.u32Width   = ALIGN_DOWN(u32Width / u32Square, 2);
                stChnAttr.stRect.u32Height  = ALIGN_DOWN(u32Height, 2);
            }
            else
            {
                stChnAttr.stRect.s32X       = ALIGN_DOWN((u32Width / u32Square) * (i / u32Square), 2);
                stChnAttr.stRect.s32Y       = ALIGN_DOWN((u32Height / u32Square) * (i % u32Square), 2);
                stChnAttr.stRect.u32Width   = ALIGN_DOWN(u32Width, 2);
                stChnAttr.stRect.u32Height  = ALIGN_DOWN(u32Height / u32Square, 2);
            }

            stChnAttr.u32Priority       = 0;
            stChnAttr.bDeflicker        = HI_FALSE;
        }
        else if(enMode == VO_MODE_2X4)
        {
            stChnAttr.stRect.s32X       = ALIGN_DOWN((u32Width / u32Col) * (i % u32Col), 2);
            stChnAttr.stRect.s32Y       = ALIGN_DOWN((u32Height / u32Row) * (i / u32Col), 2);
            stChnAttr.stRect.u32Width   = ALIGN_DOWN(u32Width / u32Col, 2);
            stChnAttr.stRect.u32Height  = ALIGN_DOWN(u32Height / u32Row, 2);
            stChnAttr.u32Priority       = 0;
            stChnAttr.bDeflicker        = HI_FALSE;
        }

        s32Ret=HI_MPI_VO_SetChnAttr(VoLayer,i,&stChnAttr);
        if(s32Ret!=HI_SUCCESS)
        {
            LOGE("[MPP-VO-ERROR]VO_StartChn:HI_MPI_VO_SetChnAttr failed with %#x!\n",s32Ret);
            return HI_FAILURE;
        }
        s32Ret=HI_MPI_VO_EnableChn(VoLayer,i);
        if(s32Ret!=HI_SUCCESS)
        {
            LOGE("[MPP-VO-ERROR]VO_StartChn:HI_MPI_VO_EnableChn failed with %#x!\n",s32Ret);
            return HI_FAILURE;
        }
    }

    return HI_SUCCESS;
}

//+------------------------------------------------------------------------------------------+
//|  函数名称：L_VO_HDMI_Init
//|  功能描述：初始化DHD0的HDMI通路。
//|  参数说明：无
//|  返回值说明：成功返回0
//|  备注：
//+------------------------------------------------------------------------------------------+
#ifdef HDMI_ENABLE
static int L_VO_HDMI_Init(void)
{
    HI_S32 s32Ret = HI_SUCCESS;
    VO_PUB_ATTR_S stVoPubAttr_HDMI={0};
    stVoPubAttr_HDMI.enIntfType = VO_INTF_HDMI;
    stVoPubAttr_HDMI.enIntfSync = enIntfSync_HDMI;
    stVoPubAttr_HDMI.u32BgColor = COLOR_RGB_BLUE;
    s32Ret = HI_MPI_VO_SetPubAttr(VoDev_HDMI, &stVoPubAttr_HDMI);
    if(s32Ret != HI_SUCCESS)
    {
        LOGE("[MPP-VO(HDMI)-ERROR]L_VO_HDMI_Init:HI_MPI_VO_SetPubAttr failed with %#x!\n", s32Ret);
        goto FAIL_0;
    }

    s32Ret=HI_MPI_VO_Enable(VoDev_HDMI);
    if(s32Ret!=HI_SUCCESS)
    {
        LOGE("[MPP-VO(HDMI)-ERROR]L_VO_HDMI_Init:HI_MPI_VO_Enable failed with %#x!\n", s32Ret);
        goto FAIL_0;
    }

    VO_VIDEO_LAYER_ATTR_S stLayerAttr_HDMI={0};
    stLayerAttr_HDMI.stDispRect.u32Width=u32DispWidth_HDMI;
    stLayerAttr_HDMI.stDispRect.u32Height=u32DispHeight_HDMI;
    stLayerAttr_HDMI.stDispRect.s32X=0;
    stLayerAttr_HDMI.stDispRect.s32Y=0;
    stLayerAttr_HDMI.stImageSize.u32Width=u32ImageWidth_HDMI;
    stLayerAttr_HDMI.stImageSize.u32Height=u32ImageHeight_HDMI;
    stLayerAttr_HDMI.u32DispFrmRt=u32DispFrmRt_HDMI;
    stLayerAttr_HDMI.enPixFormat=PIXEL_FORMAT_YVU_SEMIPLANAR_420;
    stLayerAttr_HDMI.bDoubleFrame=HI_FALSE;
    stLayerAttr_HDMI.bClusterMode=HI_FALSE;//视频层是否采用聚集模式
    stLayerAttr_HDMI.enDstDynamicRange=DYNAMIC_RANGE_SDR8;
    //****************************************
    //如果不是直通模式，需要设置显示缓冲区，
    //第二个参数范围为[0],[3-15]或[0],[2-15]。
    //——《参考》P527
    //****************************************
    s32Ret=HI_MPI_VO_SetDisplayBufLen(VoLayer_HDMI,3);
    if(HI_SUCCESS!=s32Ret)
    {
        LOGE("[MPP-VO(HDMI)-ERROR]L_VO_HDMI_Init:HI_MPI_VO_SetDisplayBufLen failed with %#x!\n",s32Ret);
        goto FAIL_1;
    }

    s32Ret=HI_MPI_VO_SetVideoLayerAttr(VoLayer_HDMI,&stLayerAttr_HDMI);
    if(s32Ret!=HI_SUCCESS)
    {
        LOGE("[MPP-VO(HDMI)-ERROR]L_VO_HDMI_Init:HI_MPI_VO_SetVideoLayerAttr failed with %#x!\n",s32Ret);
        goto FAIL_1;
    }

    s32Ret=HI_MPI_VO_EnableVideoLayer(VoLayer_HDMI);
    if(s32Ret!=HI_SUCCESS)
    {
        LOGE("[MPP-VO(HDMI)-ERROR]L_VO_HDMI_Init:HI_MPI_VO_EnableVideoLayer failed with %#x!\n",s32Ret);
        goto FAIL_1;
    }

    s32Ret=VO_StartChn(VoLayer_HDMI);
    if(s32Ret!=HI_SUCCESS)
    {
        LOGE("[MPP-VO(HDMI)-ERROR]L_VO_HDMI_Init:VO_StartChn failed!\n");
        goto FAIL_2;
    }

    s32Ret=L_Start_HDMI(DYNAMIC_RANGE_SDR8);
    if(s32Ret!=0)
    {
        LOGE("[MPP-VO(HDMI)-ERROR]L_VO_HDMI_Init:L_Start_HDMI failed!\n");
        goto FAIL_3;
    }

    return 0;

FAIL_3:
    HI_MPI_VO_DisableChn(VoLayer_HDMI,VoChn_HDMI);
FAIL_2:
    HI_MPI_VO_DisableVideoLayer(VoLayer_HDMI);
FAIL_1:
    HI_MPI_VO_Disable(VoDev_HDMI);
FAIL_0:
    return -1;
}
#endif

//+------------------------------------------------------------------------------------------+
//|  函数名称：L_VO_Init
//|  功能描述：视频输出所需的初始化。
//|  参数说明：无
//|  返回值说明：成功返回0
//|  备注：
//+------------------------------------------------------------------------------------------+
int L_VO_Init(void)
{
    HI_S32 s32Ret = HI_SUCCESS;

#ifdef HDMI_ENABLE
    s32Ret = L_VO_HDMI_Init();
    if(s32Ret != 0){LOGE("[MPP-VO(HDMI)-ERROR]L_VO_Init:L_VO_HDMI_Init failed!\n");return -1;}
#endif

    return 0;
}

//+------------------------------------------------------------------------------------------+
//|  函数名称：L_VO_DeInit
//|  功能描述：视频输出所需的去初始化。
//|  参数说明：无
//|  返回值说明：无
//|  备注：
//+------------------------------------------------------------------------------------------+
void L_VO_DeInit(void)
{
#ifdef HDMI_ENABLE
    L_Stop_HDMI();
    HI_MPI_VO_DisableChn(VoLayer_HDMI, VoChn_HDMI);
    HI_MPI_VO_DisableVideoLayer(VoLayer_HDMI);
    HI_MPI_VO_Disable(VoDev_HDMI);
#endif
}
